package transformer;

import hbt.dao.ClienteDAO;
import hbt.dao.GeneralDAO;
import negocio.Cliente;
import negocio.CondicionOperacion;
import negocio.Cotizacion;
import negocio.Entidad;
import negocio.Factura;
import negocio.Financiacion;
import negocio.ItemCotizacion;
import negocio.ItemOrdenCompra;
import negocio.ItemOrdenPedido;
import negocio.OrdenCompra;
import negocio.OrdenPedido;
import negocio.PagoContado;
import negocio.Proveedor;
import negocio.Remito;
import negocio.Rodamiento;
import util.FechaUtil;
import Enum.EEstadoOP;
import beans.CondicionOperacionBean;
import beans.EntidadBean;
import beans.FacturaBean;
import beans.FechasFacturaBean;
import beans.FinanciacionBean;
import beans.OrdenDeCompraBean;
import beans.OrdenDePedidoBean;
import beans.PagoContadoBean;
import beans.ReferenciaOPBean;
import beans.ReferenciaOrdenPedidoCompletaBean;
import beans.ReferenciaRemitoBean;
import beans.RemitoBean;
import beans.RodamientoBean;

public class BeanTransformer {

	public static OrdenPedido toOrdenPedido(OrdenDePedidoBean opb)
			throws Exception {
		OrdenPedido op = new OrdenPedido();

		op.setNumeroOP(opb.getNumero());
		op.setCliente(ClienteDAO.getInstancia().findById(
				opb.getCliente().getCuil()));
		if (opb.getEstado() == null) {
			op.setEstado(EEstadoOP.pendiente);
		} else {
			// NO hago nada porq en realidad el bean q utiliza ODV no tiene
			// estado
		}
		op.setFecha(FechaUtil.getSqlDateFromString(opb.getFecha()));
		// solo necestio referencia de la cotizacion
		Cotizacion c = (Cotizacion) GeneralDAO.getInstancia().findById(
				Cotizacion.class,
				opb.getReferencia().getCotizacion().getNumero());

		for (RodamientoBean r : opb.getReferencia().getCotizacion()
				.getRodamientos()) {
			ItemOrdenPedido i = new ItemOrdenPedido();
			for (ItemCotizacion itemCot : c.getItemsCotizacion()) {
				if (itemCot.getAsRodamientoBean().equals(r)) {
					i.setProveedor(itemCot.getProveedor());
				}
			}
			i.setCantidad(r.getCantidad());
			i.setCotizacion(c);
			i.setRodamiento(new Rodamiento(r));

			op.getItemsOrdenPedido().add(i);
		}
		return op;
	}

	public static Cliente toCliente(EntidadBean cliente) {
		Cliente c = new Cliente();
		return (Cliente) toEntidad(cliente, c);
	}

	public static Entidad toEntidad(EntidadBean eb, Entidad e) {
		e.setCuil(eb.getCuil());
		e.setRazonSocial(eb.getRazonSocial());

		if (eb.getCondiciones() != null) {
			for (CondicionOperacionBean cob : eb.getCondiciones()) {
				if (cob.isFinanciacion()) {
					Financiacion f = new Financiacion();
					f.setPorcentaje(((FinanciacionBean) cob).getRecargo());
					f.setPorcentaje(((FinanciacionBean) cob).getCantidadDias());
					e.getCondiciones().add(f);
				} else {
					PagoContado f = new PagoContado();
					f.setPorcentaje(((PagoContadoBean) cob).getDescuento());
					e.getCondiciones().add(f);
				}
			}
		}
		return e;
	}
	
	public static Proveedor toProveedor(EntidadBean entidad) {
		Proveedor c = new Proveedor();
		return (Proveedor) toEntidad(entidad, c);
	}

	public static OrdenDeCompraBean toOrdenDeCompraBean(OrdenCompra o) {
		OrdenDeCompraBean ocb = new OrdenDeCompraBean();
		ocb.setNumero(o.getNumero());
		ocb.setFechaEmision(FechaUtil.getStringFromSqlDate(o.getFecEmision()));
		ocb.setProveedor(o.getProveedor().getBean());
		for (ItemOrdenCompra i : o.getItems()) {
			RodamientoBean r = i.getRodamiento().getBean();
			r.setCantidad(i.getCantidad());
			ocb.getRodamientos().add(r);
		}

		return ocb;
	}

	public static RemitoBean toRemitoBean(Remito remito) {
		RemitoBean rb = new RemitoBean();
		rb.setCliente(remito.getCliente().getBean());
		rb.setEmision(FechaUtil.getStringFromSqlDate(remito.getFechaEmision()));
		rb.setNumero(remito.getNumero());
		ReferenciaOPBean ref = new ReferenciaOPBean();
		ReferenciaOrdenPedidoCompletaBean op = toReferenciaOrdenPedidoCompletaBean(remito
				.getOrdenPedido());
		ref.setOrdenPedido(op);
		rb.setReferencia(ref);
		return rb;

	}

	private static ReferenciaOrdenPedidoCompletaBean toReferenciaOrdenPedidoCompletaBean(
			OrdenPedido op) {
		ReferenciaOrdenPedidoCompletaBean ret = new ReferenciaOrdenPedidoCompletaBean();
		ret.setFecha(FechaUtil.getStringFromSqlDate(op.getFecha()));
		ret.setNumero(op.getNumeroOP());
		for (ItemOrdenPedido i : op.getItemsOrdenPedido()) {
			RodamientoBean r = i.getRodamiento().getBean();
			r.setCantidad(i.getCantidad());
			ret.getRodamientos().add(r);
		}
		return ret;
	}

	public static FacturaBean toFacturaBean(Factura f) {
		FacturaBean fb = new FacturaBean();
		fb.setCliente(f.getCliente().getBean());
		FechasFacturaBean ffb = new FechasFacturaBean();
		ffb.setFechaEmision(f.getFechaEmision().toString());
		ffb.setVencimiento(f.getFechaVencimiento().toString());
		fb.setFechas(ffb);

		ReferenciaRemitoBean rrb = new ReferenciaRemitoBean();
		for (ItemOrdenPedido i : f.getRemito().getOrdenPedido()
				.getItemsOrdenPedido()) {
			RodamientoBean r = i.getRodamiento().getBean();
			r.setCantidad(i.getCantidad());
			for (ItemCotizacion ic : i.getCotizacion().getItemsCotizacion()) {
				if (ic.getRodamientoComponente().getRodamiento()
						.equals(i.getRodamiento())) {
					r.setPrecio(ic.getImporte());

				}
			}
			rrb.getRodamientos().add(r);

		}
		fb.setReferencia(rrb);
		for (CondicionOperacion co : f.getCondicionesVenta()) {
			fb.getCondicionesVenta().add(co.getBean());
		}
		return fb;
	}
}
